// setTimeout(function () {
//   /* 宏任务 */
//   console.log(1)
// })
// new Promise(function (resolve) {
//   console.log(2)
//   resolve()
// })
//   .then(function () {
//     console.log(3)
//   })
//   .then(function () {
//     console.log(4)
//   })
// console.log(5)

// /* 定时器：宏任务
// Promise.then():微任务
// */

// // 25341

// setTimeout(() => {
//   new Promise((resolve) => {
//     resolve()
//   }).then(() => {
//     console.log('test')
//   })
//   console.log(4)
//   setTimeout(() => {
//     console.log(8)
//   })
// })
// new Promise((resolve) => {
//   resolve()
//   console.log(1)
// }).then(() => {
//   console.log(3)
//   Promise.resolve()
//     .then(() => {
//       console.log('before timeout')
//     })
//     .then(() => {
//       Promise.resolve().then(() => {
//         console.log('also before timeout')
//       })
//     })
// })
// console.log(2)

// // 123 before timeout   also before timeout  4 test

// console.log(1)
// setTimeout(function () {
//   console.log(2)
// }, 0)
// const p = new Promise((resolve, reject) => {
//   resolve(4)
// })
// p.then((data) => {
//   console.log(data)

// })
// console.log(3)

// setTimeout(function () {
//   console.log(5)
// }, 0)

// // 1342

// console.log(1)
// setTimeout(function () {
//   console.log(2)
//   new Promise(function (resolve) {
//     console.log(3)
//     resolve()
//   }).then(function () {
//     console.log(4)
//   })
// })

// new Promise(function (resolve) {
//   console.log(5)
//   resolve()
// }).then(function () {
//   console.log(6)
// })

// setTimeout(function () {
//   console.log(7)
//   new Promise(function (resolve) {
//     console.log(8)
//     resolve()
//   }).then(function () {
//     console.log(9)
//   })
// })
// console.log(10)
// // 1  5  10  6   2  3  4   7  8  9

async function async1() {
  console.log('async1 start')
  await async2()
  console.log('async1 end') // 是一个微任务
  await async3()
  console.log('async3 end')
}
async function async2() {
  console.log('async2')
}

async function async3() {
  console.log('async3')
}

async1()
setTimeout(() => {
  console.log('timeout')
}, 0)
new Promise(function (resolve) {
  console.log('promise1')
  resolve()
}).then(function () {
  console.log('promise2')
})
console.log('script end')

// async1 start   async2  async1 end   promise1  script end   promise2  timeout
//

//
/*
async1 start
async2
promise1
script end
async1 end
async3
promise2
async3 end
timeout
*/
